﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Http;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;

namespace DemoPersonalizeSearch
{
    public class PersonalizeSearch
    {
        
        //lấy dữ liệu bằng cách truy vấn dựa trên url
        public WResultItem GetLinkDataWithWeight(string url)
        { 
            //hash url
            string urlHash = MyExtensionMethod.GetMd5Hash(url);
            //get data
            HttpClient client = new HttpClient();
            string json = client.GetStringAsync(String.Format("http://feeds.delicious.com/v2/json/url/{0}?count=100",urlHash)).Result;
            //parse json
            JArray items = JArray.Parse(json);
            List<string> list = new List<string>();

            foreach (JObject jo in items)
            {
                foreach (var t in jo["t"].Children())
                {
                    list.Add(t.ToString());
                }
            }
            // 
            List<TagItem> listTags = list.GroupBy(x => x.ToLower()).Select(y => new { TagName = y.Key, Weight = y.Count() }).OrderByDescending(z => z.Weight).Select(t=> new TagItem(t.TagName,t.Weight)).ToList();
           // Console.WriteLine(groups.Count());
            WResultItem item = new WResultItem();
            item.Url = url;
            item.Tags = listTags;
            return item;
            
            
        }
        public Object Search(string query,int limit,bool isCached,UserData ud)
        {
            //chuẩn hóa chuỗi truy vấn
            query = query.RemoveAllDoubleSpace();
            if (query.Replace(" ", "") == "") return null;
            query = query.Replace(" ", "+");
            
            
            //câu truy vấn dữ liệu
            string queryRequest = "http://feeds.delicious.com/v2/json/tag/" + query + "?count="+limit;

            
            //get and convert result data
            HttpClient client = new HttpClient();
            //chuỗi json trả về
            string json = client.GetStringAsync(queryRequest).Result;
            //Parse dữ liệu
            JArray items = JArray.Parse(json);
            List<WResultItem> list = new List<WResultItem>();
            List<LinkData> newList = new List<LinkData>();
            DeliciousDatabaseDataContext db = new DeliciousDatabaseDataContext();
            db.CommandTimeout = 10000;
            int max = db.LinkDatas.Max(x => x.LinkId)+1;
            foreach (JObject jo in items)
            {
                string description = jo["d"].ToString();
               
                string url = jo["u"].ToString();
                //search in database
              
                LinkData ld = db.LinkDatas.Where(x => x.Hash == url.GetMd5Hash()).FirstOrDefault();
                WResultItem ri = new WResultItem();
                //nếu dữ liệu đã có thì lấy từ database
                if (ld != null && ld.TagData !=null)
                {
                    ri.ParseLinkData(ld);
                    
                }
                else
                {
                    //ngược lại thì sử dụng api để lấy dữ liệu
                    ri = GetLinkDataWithWeight(url);
                    ri.Title = description;
                    ri.DateModified = DateTime.MinValue;
                    //kết hợp lưu xuống csdl
                    if (isCached)
                    {
                        ld = new LinkData();
                        ld.LinkId = max++;
                        ld.Title = ri.Title;
                        ld.URL = ri.Url;
                        ld.Hash = ri.Url.GetMd5Hash();
                        ld.TagData = ri.Tags.ToStringFomated();
                        ld.DateModified = DateTime.Now;
                        newList.Add(ld);
                    }
                    

                }
                //kết hợp profile của người dùng.
                if (ud != null)
                {
                    UserItem ui = new UserItem();
                    ui.ParseUserData(ud);
                    ri.RankingScore = ui.GetCosinSimilarity(ri);
                }
                else ri.RankingScore = 0;
                list.Add(ri);
            }
            if (isCached)
            {
                //lưu xuống các link mới
                db.LinkDatas.InsertAllOnSubmit(newList);
                db.SubmitChanges();
            }
            //trả về kết quả.
            Object data = list.OrderByDescending(x=>x.RankingScore).Select(x => new { Title = x.Title, LinkRef = x.Url, Tags = x.Tags.ToStringUser(query), RankingScore = x.RankingScore, DateModified = (x.DateModified != DateTime.MinValue) ? String.Format("&nbsp;- Cached at {0}", x.DateModified.ToShortDateString() + " " + x.DateModified.ToShortTimeString()) : "" }).ToList();
            return data;
            
        }
    }
}